﻿Imports DotNetNuke
Imports DotNetNuke.Common
Imports DotNetNuke.Common.Utilities
Imports DotNetNuke.Common.Lists
Imports DotNetNuke.Entities.Users
Imports DotNetNuke.Entities.Profile
Imports DotNetNuke.Services.Exceptions
Imports DotNetNuke.Security.Roles
Imports DotNetNuke.Security.Profile
Imports DotNetNuke.Services.Localization
Imports DotNetNuke.Services.Mail
Imports DotNetNuke.Security.Membership
Imports TN.Module.FormerStudents
Imports DotNetNuke.UI.Utilities
Imports DotNetNuke.Entities.Modules.UserUserControlBase
Imports DotNetNuke.Entities.Modules
Imports NVPortal.Modules.NVNews
Namespace NVPortal.Modules.NVUser
    Partial Public Class SignUp
        Inherits DotNetNuke.Entities.Modules.PortalModuleBase

#Region "property"
        Public Property Id_User() As Integer
            Get
                If Not ViewState.Item("Id_User") Is Nothing Then
                    Dim x As Integer = Null.NullInteger
                    Try
                        x = Integer.Parse(ViewState.Item("Id_User"))
                    Catch ex As System.Exception
                        x = Null.NullInteger
                    End Try
                    Return x
                Else
                    ViewState.Add("Id_User", Null.NullInteger.ToString)
                    Return Null.NullInteger
                End If
            End Get
            Set(ByVal Value As Integer)
                ViewState.Item("Id_User") = Value.ToString
            End Set
        End Property
#End Region

#Region "Public Methods"

        ''' <summary>
        ''' Cập nhật thông tin hồ sơ
        ''' </summary>
        ''' <param name="objUserInfo"></param>
        ''' <remarks></remarks>
        Public Sub UpdateUserProfile(ByVal objUserInfo As UserInfo)
            'TrungNS
            objUserInfo.FirstName = txtTen.Text.Trim
            objUserInfo.Profile.SetProfileProperty("MiddleName", txtDem.Text.Trim)
            objUserInfo.LastName = txtHo.Text.Trim
            objUserInfo.Email = txtEmail.Text.Trim
            Dim birthDay As String = ddlDay.SelectedValue.ToString + "/" + ddlMonth.SelectedValue.ToString + "/" + ddlYear.Text
            objUserInfo.Profile.SetProfileProperty("DateOfBirth", birthDay)
            If drdSex.SelectedValue = "Nam" Then
                objUserInfo.Profile.SetProfileProperty("Sex", "Nam")
            Else
                objUserInfo.Profile.SetProfileProperty("Sex", "Nữ")
            End If
            objUserInfo.Profile.SetProfileProperty("Telephone", txtPhone.Text)
            objUserInfo.Profile.SetProfileProperty("Cell", txtCell.Text)
            objUserInfo.Profile.SetProfileProperty("interpret", txtDes.Text)

            ProfileController.UpdateUserProfile(objUserInfo)
        End Sub

        ''' <summary>
        ''' Load dữ liệu phòng ban
        ''' </summary>
        ''' <remarks></remarks>
        ''' Bind danh mục
        Public Sub BindDepartment()
            Dim ctlNewsCategory As New NV_NewsCategoriesController
            Dim arrNewsCategories As New ArrayList
            arrNewsCategories = ctlNewsCategory.GetAll(PortalId)
            Dim arrTemp As New ArrayList
            Dim objNewsCategories As NV_NewsCategoriesInfo
            Dim objNewsCategoriesTemp As NV_NewsCategoriesInfo
            Dim objNewsCategoriesTemp3 As NV_NewsCategoriesInfo

            If arrNewsCategories.Count > 0 Then
                For Each objNewsCategories In arrNewsCategories
                    If objNewsCategories.ParentId = 0 Then
                        arrTemp.Add(objNewsCategories)
                        For Each objNewsCategoriesTemp In arrNewsCategories
                            If objNewsCategoriesTemp.ParentId = objNewsCategories.CategoryID Then
                                objNewsCategoriesTemp.CategoryName = "||---- " & objNewsCategoriesTemp.CategoryName
                                arrTemp.Add(objNewsCategoriesTemp)

                                For Each objNewsCategoriesTemp3 In arrNewsCategories
                                    If objNewsCategoriesTemp3.ParentId = objNewsCategoriesTemp.CategoryID Then
                                        objNewsCategoriesTemp3.CategoryName = "||----||---- " & objNewsCategoriesTemp3.CategoryName
                                        arrTemp.Add(objNewsCategoriesTemp3)
                                    End If
                                Next

                            End If
                        Next
                    End If
                Next
            End If

            Me.drgViewData.DataSource = arrTemp
            Me.drgViewData.DataBind()
        End Sub

        ''' <summary>
        ''' Lấy danh sách Vai trò(Role) theo Nhóm quyền
        ''' </summary>
        ''' <param name="RoleGroupId"></param>
        ''' <remarks></remarks>
        Public Sub BindRole(ByVal RoleGroupId As Integer)
            Dim ctl As RoleController = New RoleController
            Dim listOfRole As ArrayList = ctl.GetRolesByGroup(PortalId, RoleGroupId)
            chkListRole.DataSource = listOfRole
            chkListRole.DataTextField = "Description"
            chkListRole.DataValueField = "RoleId"
            chkListRole.DataBind()
        End Sub

        ''' <summary>
        ''' Lưu lại vai trò của người dùng (Mỗi vai trò tương ứng với 1 Role)
        ''' </summary>
        ''' <param name="U_Id"></param>
        ''' <remarks></remarks>
        Public Sub Save_UserRole(ByVal U_Id As Integer)
            Dim ctlRole As RoleController = New RoleController
            For Each itm As ListItem In chkListRole.Items
                If itm.Selected Then
                    ctlRole.AddUserRole(PortalId, U_Id, itm.Value, Null.NullDate)
                End If
            Next
        End Sub

        ''' <summary>
        ''' Lưu lại thông tin phòng ban và chức vụ, nhiệm vụ cho người dùng
        ''' </summary>
        ''' <param name="U_Id"></param>
        ''' <remarks></remarks>
        Public Sub Save_UserDepartment(ByVal U_Id As Integer)
            Dim ctl As CatUserController = New CatUserController
            Dim chkLanhDao As CheckBox
            Dim chkChon As CheckBox
            For Each obj As DataGridItem In drgViewData.Items
                chkChon = CType(obj.FindControl("chkChon"), CheckBox)
                If chkChon.Checked Then
                    chkLanhDao = CType(obj.FindControl("chkLanhDao"), CheckBox)

                    'Luu thong tin Phongban - nguoi dung - chuc vu
                    Dim objPhongbanNguoidung As CatUserInfo = New CatUserInfo
                    objPhongbanNguoidung.UserId = U_Id
                    objPhongbanNguoidung.Catid = drgViewData.DataKeys.Item(obj.ItemIndex)
                    objPhongbanNguoidung.PortalId = PortalId
                    objPhongbanNguoidung.LeaderCat = chkLanhDao.Checked
                    ctl.Insert(objPhongbanNguoidung.Catid, objPhongbanNguoidung.UserId, "", objPhongbanNguoidung.PortalId, objPhongbanNguoidung.LeaderCat)
                End If
            Next
        End Sub

        Public Sub BindYear()
            For i As Integer = 1940 To 2020
                ddlYear.Items.Add(New ListItem(i.ToString, i))
            Next
        End Sub

#End Region

#Region "Event Handler"

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Dim slanguage As String = TNFormerStudentHepler.GetCurrentLanguage(Response)
                ErrorValidateServer.Text = String.Empty
                If Not IsPostBack Then
                    BindYear()
                    BindDepartment()
                    'Load vai trò
                    Dim roleGroupId As Integer = Null.NullInteger
                    If CType(Settings(TNFormerStudentContants.RoleGroupIdSetting + slanguage + PortalId.ToString), String) <> "" Then
                        roleGroupId = Convert.ToInt32(Settings(TNFormerStudentContants.RoleGroupIdSetting + slanguage + PortalId.ToString))
                    End If
                    BindRole(roleGroupId)

                    'Ẩn tùy chọn kích hoạt nếu user không có quyền set kích hoạt
                    If UserId = 1 Or UserInfo.IsInRole("Administrators") Or UserInfo.IsInRole("Manager") Or (UserId = PortalSettings.AdministratorId) Then 'TrungNS: Add CHECK if User is Portal Administrator
                        chkApprove.Visible = True
                        chkApprove.Checked = True
                    Else
                        chkApprove.Visible = False
                        chkApprove.Checked = False
                    End If
                End If
            Catch ex As Exception
                ProcessModuleLoadException(Me, ex)
            End Try
        End Sub

        ''' <summary>
        ''' Đăng ký: tạo tài khoản người dùng và cập nhật thông tin hồ sơ
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub btnSignUp_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSignUp.Click
            Try
                Dim strResponse As String = String.Empty
                Dim objUser As New UserInfo()

                objUser.PortalID = PortalId
                objUser.Username = TNFormerStudentHepler.CorrectUserName(txtUserName.Text, PortalId)
                objUser.FirstName = txtTen.Text
                objUser.LastName = txtHo.Text
                objUser.DisplayName = txtHo.Text.Trim + " " + txtDem.Text.Trim + " " + txtTen.Text.Trim
                objUser.Email = txtEmail.Text

                'Nếu đây là người quản trị tạo thì duyệt hay không duyệt là do ý người quản trị
                If UserId = 1 Or UserInfo.IsInRole("Administrators") Or UserInfo.IsInRole("Manager") Or (UserId = PortalSettings.AdministratorId) Then 'TrungNS: Add CHECK if User is Portal Administrator
                    objUser.Membership.Approved = chkApprove.Checked
                Else
                    'Nếu nếu do người dùng đăng ký thì portal được cấu hình cho phép hoạt động luôn thì duyệt luôn và ngược lại
                    If Me.PortalSettings.UserRegistration = DotNetNuke.Common.Globals.PortalRegistrationType.PublicRegistration Then
                        objUser.Membership.Approved = True
                    Else
                        objUser.Membership.Approved = False
                    End If
                End If

                objUser.Membership.Password = txtPassword.Text
                objUser.AffiliateID = Null.NullInteger

                Dim objUserCreateStatus As UserCreateStatus = UserController.CreateUser(objUser)

                Dim args As UserCreatedEventArgs
                If objUserCreateStatus = UserCreateStatus.Success Then
                    args = New UserCreatedEventArgs(objUser)
                    args.Notify = True
                    args.CreateStatus = objUserCreateStatus
                    'Thực hiện một số DNN logic
                    Dim objUserBase As New UserUserControlBase
                    objUserBase.User = objUser
                    objUserBase.OnUserCreated(args)
                    objUserBase.OnUserCreateCompleted(args)

                    UpdateUserProfile(objUser)
                    Save_UserRole(objUser.UserID)
                    Save_UserDepartment(objUser.UserID)

                    'Clear Cache
                    'DotNetNuke.Common.Utilities.DataCache.RemoveCache(TNCacheKey.DanhSachNguoiDung.ToString)
                    If Request.IsAuthenticated Then
                        'Đây là trường hợp người quản trị tạo mới người dùng nên thống báo là tạo mới thành công người dùng
                        strResponse = "Thêm mới thành công người dùng"
                        ClientAPI.RegisterStartUpScript(Me.Page, "showmessage", "<script>alert('" + strResponse + "');</script>")
                    Else
                        'Đây là trường hợp người dùng tự đăng ký
                        'Nếu portal được cấu hình cho phép hoạt động luôn thì đăng nhập luôn và chuyển về trang cập nhật profile
                        If Me.PortalSettings.UserRegistration = DotNetNuke.Common.Globals.PortalRegistrationType.PublicRegistration Then
                            UserController.UserLogin(PortalId, objUser, PortalSettings.PortalName, Request.UserHostAddress(), True)
                            'chuyền về trang cập nhật thông tin người dùng
                            Response.Redirect(NavigateURL(133))
                        Else
                            'Thông báo đăng ký thành công
                            strResponse = "Bạn đã đăng ký thành công"
                            ClientAPI.RegisterStartUpScript(Me.Page, "showmessage", "<script>alert('" + strResponse + "');</script>")
                        End If
                    End If
                Else
                    args = New UserCreatedEventArgs(Nothing)
                    args.CreateStatus = objUserCreateStatus
                    args.Notify = False
                    'Thực hiện một số DNN logic
                    Dim objUserBase As New UserUserControlBase
                    objUserBase.OnUserCreated(args)
                    objUserBase.OnUserCreateCompleted(args)

                    strResponse = [String].Format("Error: {0}", objUserCreateStatus.ToString())
                    ClientAPI.RegisterStartUpScript(Me.Page, "showmessage", "<script>alert('" + strResponse + "');</script>")
                End If
            Catch ex As Exception
                ProcessModuleLoadException(Me, ex)
            End Try
        End Sub

        ''' <summary>
        ''' Kiểm tra xem user này đã tồn tại chưa? Nếu tồn tại rồi thì thông báo
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub btnCheckExistUser_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCheckExistUser.Click
            Try
                If String.IsNullOrEmpty(txtUserName.Text.Trim) Then
                    ErrorValidateServer.Text = "Tài khoản đăng nhập hệ thống không được để trống"
                    ErrorValidateServer.Visible = True
                Else
                    Dim oUser As UserInfo = UserController.GetUserByName(PortalId, TNFormerStudentHepler.CorrectUserName(txtUserName.Text.Trim, PortalId))
                    If Not oUser Is Nothing Then
                        ErrorValidateServer.Text = "Tài khoản bạn chọn đã tồn tại trong hệ thống, hãy chọn tài khoản khác"
                        ErrorValidateServer.Visible = True
                    Else
                        ErrorValidateServer.Text = "Tài khoản bạn chọn phù hợp, mời tiếp tục"
                        ErrorValidateServer.Visible = True
                    End If
                End If
            Catch ex As Exception
                ProcessModuleLoadException(Me, ex)
            End Try
        End Sub

#End Region

    End Class
End Namespace
